// 云对象教程: https://uniapp.dcloud.net.cn/uniCloud/cloud-obj
// jsdoc语法提示教程：https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/129

module.exports = {
	_before: function () { // 通用预处理器

	},
	/**
	 * 从数据库获取数据列表
	 * @param table {string} param1 要查询的主表
	 * @param where {string/object} 主表条件
	 * @param order {string} 主表排序
	 * @param field {string} 要查询的主表字段
	 * @param skip {int} 查询开始位置，为0则从头开始
	 * @param limit {int} 单次查询的条数
	 * @param collTable {string} 关联表名
	 * @param collTableField {string} 副标查询的字段
	 * @param collTableWhere{object/string} 副表查询条件
	 * @param collTableOrder {string} 副表排序
	 * @param collTableSkip {int} 副表查询开始位置
	 * @param collTableWhere {int} 副表查询条数
	 * @returns {object},数组在res.data中
	 */
	async getList(table,where={},order="",field=null,skip=0,limit=10,collTable=false,collTableField=null,collTableWhere={},collTableOrder="",collTableSkip=0,collTableLimit=5) {
		// 参数校验，如无参数则不需要
		if (!table) return {errCode: '001',errMsg: '数据表不能为空'} ;
		try{
			const dbJql = uniCloud.databaseForJQL() ;
			if(collTable== false){
				const result = await dbJql.collection(table).where(where).field(field).orderBy(order).skip(skip).limit(limit).get({getCount:true}) ;
				return	result ;
			}else{
				const a = dbJql.collection(table).where(where).field(field).orderBy(order).skip(skip).limit(limit).getTemp();
				const b = dbJql.collection(collTable).where(collTableWhere).field(collTableField).orderBy(collTableOrder).skip(collTableSkip).limit(collTableLimit).getTemp();
				return dbJql.collection(a,b).get();
			}
		}catch(e){
			 return e;
		}
	},
	/**
	 * 作用：获取单条数据
	 * @param table {string} param1 要查询的主表
	 * @param where {string/object} 主表条件
	 * @param field {string} 要查询的主表字段
	 * @param collTable {string} 关联表名
	 * @param collTableField {string} 副标查询的字段
	 * @param collTableIsGetOne {bool} 副标是否也查询单条
	 * @returns {object},数组在res.data中
	 */
	async getOne(table,where={},field,collTable=false,collTableField=null,collTableIsGetOne=true){
		try{
		const dbJQL = uniCloud.databaseForJQL({ // 获取JQL database引用，此处需要传入云对象的clientInfo
			clientInfo: this.getClientInfo()
		});
		//如果存在关联表，则为联表查询
		if(collTable!=false){
			const a = dbJQL.collection(table).where(where).field(field).getTemp({getOne:true});
			const b = dbJQL.collection(collTable).field(collTableField).getTemp({getOne:collTableIsGetOne});
			return await dbJQL.collection(a,b).get({getOne:true});
		}else{
			return await dbJQL.collection(table).where(where).field(field).get({getOne:true});
		}
		}catch(error){
			return error;
		}
	},
	/**
	* 作用：添加数据到数据库
	* @param table {string} 要插入的表名
	* @param data {object}  插入的数据
	* @return object
	*/
	 async addData(table,data){
		if (!table) return {errCode: '001',errMsg: '数据表不能为空'}
		if (!data) return {errCode: '003',errMsg: '没有提供任何要添加的数据'}
		try{
			const dbJQL = uniCloud.databaseForJQL({ clientInfo: this.getClientInfo()});
			return await dbJQL.collection(table).add(data);
		}catch(e){
			return e;
		}
	},
	/**
	* 作用：修改数据到数据库
	* @param table {string} 要插入的表名
	* @param data {object}  要修改的数据
	* @param where {object/string} 修改数据需要的条件
	* @return object
	*/
	async updateData(table,data,where){
		if (!table) return {errCode: '001',errMsg: '数据表不能为空'} ;
		if (!where) return {errCode: '002',errMsg: '缺少修改数据必须的where'} ;
		if (!data) return {errCode: '003',errMsg: '没有提供任何待修改的数据'} ;
		try{
			const dbJQL = uniCloud.databaseForJQL({ clientInfo: this.getClientInfo()});
			return dbJQL.collection(table).where(where).update(data);
		}catch(e){
		   return e;
		}
	},
	/**
	* 作用：从数据表删除数据
	* @param table {string} 表名
	* @param where {string/object} 条件
	* @param fileList {Array}  要删除的文件数组，如果待删除的记录有图片、视频等文件，请务必传递删除
	* @return object
	*/
	async deleteData(table,where,fileList=null){
		try{
		    const dbJQL = uniCloud.databaseForJQL({ clientInfo: this.getClientInfo() });
			//判断是否有文件需要删除，如果有文件需要删除，则先删除文件
			if(fileList!=null){ 
				uniCloud.deleteFile({fileList: fileList});
			}
			return dbJQL.collection(table).where(where).remove();
		}catch(e){
			return e ;
		}
	},
	/**
	* 作用：删除文件
	* @param fileList {Array}  要删除的文件数组，如果待删除的记录有图片、视频等文件，请务必传递删除
	* @return object
	*/
	async deleteFile(fileList=null){
		try{
		    const dbJQL = uniCloud.databaseForJQL({ clientInfo: this.getClientInfo() });
			//判断是否有文件需要删除
			if(fileList!=null){ 
				return 	uniCloud.deleteFile({fileList: fileList});
			}else{
				return {
					code:1004,
					message:'删除失败',
					error:'没有文件需要删除'
				}
			}
		}catch(e){
			return e ;
		}
	},
	/**
	 * - 百度云 人工智能 图像识别文字
	 * @param imagePath {String} 选择图片完整Url,URL长度不超过1024字节
	 * @param identify {String} 识别卡证Orc：'idcard'身份证、'bankcard'银行卡、'business_license'营业执照、'passport'护照、'general_basic'标准通用
	 * @return {object} 返回json格式
	 * 第三方技术支持来自百度智能云，技术文档请参考：https://cloud.baidu.com/doc/OCR/index.html
	 * 冀 * tel：17664189378
	 */
	async ocrIdCard(imagePath, identify="idcard") {
		if (!imagePath) return {
			errCode: 'PARAM_IS_NULL',
			message:'选择图片完整URL，URL长度不超过1024字节，URL对应的图片base64编码后大小不超过4M，最短边至少15px，最长边最大4096px,支持jpg/jpeg/png/bmp格式',
		} ;
		try{
			const token ={
				grant_type:'client_credentials',
				client_id:'L8K9te2OjmnjOlDA1h9kxLmb', // API Key
				client_secret:'ZLK193u7Lq7lAMHxV8UtIoAK7Sl2ukSM',  // Secret Key
			}
			const tokenUrl = `https://aip.baidubce.com/oauth/2.0/token?grant_type=${token.grant_type}&client_id=${token.client_id}&client_secret=${token.client_secret}`;
			const accessToken = await uniCloud.httpclient.request(tokenUrl,{
				method: 'POST',data:{},contentType: 'json',dataType: 'json',
				headers:{
					'Content-Type':"application/json",
					'Accept':"application/json"
				}
			});
			const data = {
				id_card_side: 'front',
				url: imagePath, // 动态图片
				detect_risk: 'false',
				detect_quality: 'false',
				detect_photo: 'false',
				detect_card: 'false',
				detect_direction: 'false'
			};
			const headers = { 
				'Content-Type': 'application/x-www-form-urlencoded',
				'Accept': 'application/json'
			};
			return uniCloud.httpclient.request(`https://aip.baidubce.com/rest/2.0/ocr/v1/${identify}?access_token=${accessToken.data.access_token}`,{
				method: 'POST',
				data: data,
				contentType: 'json', 
				dataType: 'json',
				headers: headers,
			});
		}catch(error){
			return {message:'内部错误',error }
		}
	}

}
